/**
 * @description 版本检测工具
 * @author zjcat
 */
"use strict";

const axios = require("axios");
const urljoin = require("url-join"); //链接的拼装
const semver = require("semver"); //比对版本号

/**
 * 获取spiritos-cli npm 线上信息
 * @param {string} npmName npm名称
 * @param {stirng} registry npm线上地址
 */
function getNpmInfo(npmName, registry) {
  if (!npmName) {
    return null;
  }
  const registryUrl = registry || getDefaultRegistry();
  //拼接url
  const npmInfoUrl = urljoin(registryUrl, npmName);
  return axios
    .get(npmInfoUrl)
    .then((response) => {
      if ((response.status = 200)) {
        return response.data;
      }
      return null;
    })
    .catch((err) => {
      return Promise.reject(err);
    });
}
/**
 * 获取远程地址
 * @param {boolean} isOirginal 是否需要链接镜像 默认不需要
 */
function getDefaultRegistry(isOirginal = true) {
  return isOirginal
    ? "https://registry.npmjs.org"
    : "https://registry.npm.taobao.org";
}
/**
 * 获取npmName所有版本号
 * @param {string} npmName npm名称
 * @param {stirng} registry npm线上地址
 */
async function getNpmVersions(npmName, registry) {
  const data = await getNpmInfo(npmName, registry);
  if (data) {
    return Object.keys(data.versions);
  } else {
    return [];
  }
}

/**
 * 只留下大于本地当前版本号的版本
 * @param {stiong} baseVersion 本地版本号
 * @param {string} versions 所有线上版本号
 */
function getSemverVersions(baseVersion, versions) {
  return versions
    .filter((version) => semver.satisfies(version, `^${baseVersion}`))
    .sort((a, b) => {
      //将版本号从大到小排序
      return semver.gt(b, a);
    });
}

/**
 * 处理返回大于当前本地版本号逻辑
 * @param {string} npmName package名称
 * @param {string} baseVersion 本地版本号
 * @param {stirng} registry 获取package信息远程地址
 */
async function getNpmSemverVersions(npmName, baseVersion, registry) {
  const versions = await getNpmVersions(npmName, registry);
  const newVersions = getSemverVersions(baseVersion, versions);
  if(newVersions&&newVersions.length>0){
    return newVersions[0]
  }else{
      return null
  }
}

async function getNpmLatestVersion(npmName,registry){
  const versions = await getNpmVersions(npmName,registry);
  if(versions){
   return versions.sort((a, b) => semver.gt(b, a))[versions.length-1];
  }
  return null;
}

module.exports = {
  getNpmInfo,
  getNpmVersions,
  getNpmSemverVersions,
  getDefaultRegistry,
  getNpmLatestVersion
};
